<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    let text="85872637471533203552943982"
  // split字符串转数组，先利用sort进行排序，然后for去重，最后追加在新的数组里
  arr=text.split('').sort()
  // 先定义一个空的数组，用来装新的数组
  let newArr=[]
  // 先遍历数组
  for(let i=0;i<arr.length;i++){
    // 两两进行比较
    if(arr[i] !=arr[i+1]){
      newArr.push(arr[i])
    }
  }
  console.log(newArr);

  // 数组中出现次数最多是元素
  // 方法1
//   实现方法1的主要思想是利用键值对存储，我们可以分解为两个步骤。
// 定义一个对象，在遍历数组的时候，将数组元素作为对象的键，将出现的次数作为值
// 获取键值对后进行遍历，获取值最大的那个元素，返回后即可得到结果。
  function findMost(arr){
    if(!arr.length)return;
    if(arr.length===1) return 1
const res={}
for (let i = 0; i < arr.length; i++) {
  if (!res[arr[i]]) {
    res[arr[i]]=1
  }else{
    res[arr[i]]++
  }
  
}
let keys=Object.keys(res)
  let maxNum=0, maxEle;
  for (let i = 0, l= keys.length;i<l; i++) {
    if(res[keys[i]]>maxNum){
      maxNum=res[keys[i]]
      maxEle=keys[i]
    } 
  }
  return '出现次数最多的元素为:'+maxEle+', 出现次数为:'+maxNum
  }
 console.log(findMost(arr));
//  方法2
// 实现方法2的主要思想同方法1，不过是方法1的优化，将方法1中的两次遍历缩减为一次遍历，将值的判断放在同一个遍历中。
function findMost2(arr) {
var h = {};
var maxNum = 0;
var maxEle = null;
for (var i = 0; i < arr.length; i++) {
    var a = arr[i];
    h[a] === undefined ? h[a] = 1 : (h[a]++);
    if (h[a] > maxNum) {
        maxEle = a;
        maxNum = h[a];
    }
}
return '出现次数最多的元素为:' + maxEle + ', 出现次数为:' + maxNum;
}
console.log(findMost2(arr));
// 方法3
// 方法3的主要思想是借助数组Array的reduce方法。
// 首先我们来看看reduce方法的使用方法，它的语法如下。
// arr.reduce([callback, initialValue])
// reduce方法接收的第一个参数为函数，操作数组中的每个元素。该函数接收4个参数，每个参数的含义如下。
// 第一个参数表示上一次执行结果的回调，或者第二个参数提供的初始值
// 当前处理的元素值
// 当前处理元素的索引
// 处理的数组
// reduce方法接收的第二个参数为提供处理元素的初始值，与上面的第一个参数有关
function findMost3(arr) {
    var maxEle;
    var maxNum = 1;
    var obj = arr.reduce(function (p, k) {
        p[k] ? p[k]++ : p[k] = 1;
        if (p[k] > maxNum) {
            maxEle = k;
            maxNum++;
        }
        return p;
    }, {});
    return '次数最多的元素为:' + maxEle + ', 次数为:' + obj[maxEle];
}
console.log(findMost3(arr));
// 中reduce接收一个{}表示的初始值，p的初始值就是这个{}，k就是每次执行的数组元素。在每次执行完后与maxNum进行比较，动态更新maxNum与maxEle值，最后获得返回的结果
// 方法4
// 方法4的主要思想是借助于字符串的replace方法，因此方法4主要适用于字符数组的运算。
// 首先将数组转化为字符串，然后通过字符串的replace方法，接收处理函数，其他的原理与方法3一样。
function findMost4(arr) {
    var obj = {};
    var maxEle;
    var maxNum = 1;
    arr.join('').replace(/(\w)/g, function(word, p){
        obj[p[0]] ? obj[p[0]] += 1 : obj[p[0]] = 1;
        if (obj[p[0]] > maxNum) {
            maxEle = p[0];
            maxNum++;
        }
    });
    return '次数最多的元素为:' + maxEle + ', 次数为:' + obj[maxEle];
}
var arr2 = ['b', 'c', 'e', 'c', 'd', 'g', 'a', 'c', 'a'];
console.log(findMost4(arr2));
console.log(findMost4(arr));

const obj1={}
// 统计每个元素出现的参数次数
for (let i = 0; i < arr.length; i++) {
  let a=arr[i]
  // 把数组中的每一项元素作为属性名，出现的次数作为值存入对象
  // 如果有值，表现出现过，那么久++
  if (obj1[a]) {
    obj1[a]++
  }else{
    // 如果没有值，把其属性值设置为1
    obj1[a]=1
  }
}
console.log(obj1); 
// 利用reduce
const obj=arr.reduce((sum,item)=>(sum[item]?sum[item]++:(sum[item]=1),sum),{})
console.log(obj);
// 假设数组第一项元素出现的次数最多
let b=arr[0]
let val=obj[b]
// 遍历对象
for(let k in obj){
  if(val<obj[k]){
    val=obj[k]
    b=k
  }
}
console.log(`数组中${b}字符出现的最多，出现了${val}次`);
  </script>
</body>
</html>